#ifndef __WIZ_UTILS_REGEX_HPP__SHANHAOBO_19800429__
#define __WIZ_UTILS_REGEX_HPP__SHANHAOBO_19800429__

/// Regular Expression
#include "../../Base/WizBase.hpp"

#include "../../Core/Container/WizDataTypeList.hpp"
#include "../../DataType/WizDataTypeRange.hpp"

namespace Wiz
{
    namespace Regex
    {
        const ::Wiz::Char::Type KeyCharSet[] = 
        {
            '[', ']',
            '(', ')',
            '{', '}',
            '<', '>',
            '*', '+', '?',
            '|', '-',
            '^', '$',
            '\\',
        };

		::Wiz::Bool::Type IsKeyChar(::Wiz::Char::In Chr)
		{
			switch (Chr)
			{
			case '{':
			case '}':
			case '[':
			case ']':
			case '(':
			case ')':
			case '<':
			case '>':
			case '*':
			case '+':
			case '?':
			case '|':
			case '^':
			case '$':
			case '\\':
			case '-':
				return ::Wiz::Bool::True;
			}
			return ::Wiz::Bool::False;
		}

        class Type
        {
        public:
            Type(){}
            virtual ~Type(){}
        public:
        }; /// end of class Type

        namespace SubExp
        {
            class Type
            {
            public:
                Type(){}
                virtual ~Type(){}
            public:
            }; /// end of class Type

            namespace Charset
            {
                class Type : public ::Wiz::Regex::SubExp::Type
                {
                    typedef ::Wiz::Range::Set::Type<::Wiz::Char::Type> RangeSetType;
                public:
                    Type()
                    {
                    }
                    virtual ~Type()
                    {
                    }
                protected:
                    RangeSetType m_Range;
                };
            } /// end of namespace Charset
        } /// end of namespace SubExp

    } /// end of namespace Regex
} /// end of namespace Wiz

#endif /*__WIZ_UTILS_REGEX_HPP__SHANHAOBO_19800429__*/
